package common;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import db.DBManager;

public class Item {
	private int id;
	private String code;
	private String name;
	private String size;
	private int cost;
	private int price;
	private int on_off;
	private String image;
	private String alcohol;
	private String locality;
	private String info;
	private String category_code;
	
	public Item(){
	}
	/**
	 * 
	 * @param rs 
	 */
	public Item(ResultSet rs){
		try {
			this.setId(rs.getInt("id"));
			this.setCode(rs.getString("code"));
			this.setName(rs.getString("name"));
			this.setSize(rs.getString("size"));
			this.setCost(rs.getInt("cost"));
			this.setPrice(rs.getInt("price"));
			this.setOn_off(rs.getInt("on_off"));
			this.setImage(rs.getString("image"));
			this.setAlcohol(rs.getString("alcohol"));
			this.setLocality(rs.getString("locality"));
			this.setInfo(rs.getString("info"));
			this.setCategory_code(rs.getString("category_code"));
//			this.setStock(rs.getInt("stocks"));
		} catch (SQLException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}
	/**
	 *  
	 * @param code 商品コード（半角英数字4桁）
	 * @return 商品オブジェクト
	 */
//	商品コードを受け取り、商品情報テーブルから該当する情報を検索し商品情報オブジェクトを返す。
	public static Item find_by_code(String code){
//		ただし、該当する商品が登録されていない場合はNULLを返す。
//		商品コードが4桁以外の場合はNULLを返す。
		Item item= null;
		Connection con =  DBManager.getConnection();
		try {
			//ステートメントオブジェクトの取得
			Statement smt = con.createStatement();
			//検索する
			String sql ="select * from item where code = " + code;
			ResultSet rs = smt.executeQuery(sql);
			//検索結果をArrayListに格納する
			if(rs.next()){
				item= new Item(rs);
			}
			rs.close();
			smt.close();
		}
		catch(SQLException e){
				e.printStackTrace();
		}
		finally{ 
			try {
				if(con!=null){
				con.close();
				}
			} catch (SQLException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
		}
		return item;	
	}
	
	/**
	 * 
	 * @param name 商品名（最大255文字）
	 * @return 商品オブジェクト
	 */
//	 名前を受け取り、商品情報テーブルから部分一致で該当する情報を検索し商品情報オブジェクトを配列で返す。
	 public static List<Item> find_by_name(String name){
		String sql ="select * from item where name like'%"+name+"%' order by code";
		return find_by(sql);
		
	}
	/**
	 *
	 * @param category_code カテゴリコード（半角英数字4桁）
	 * @return 商品オブジェクト
	 */
//	 カテゴリコードを受け取り、商品情報テーブルから該当する情報を検索し商品情報オブジェクトを配列で返す。
	 public static List<Item> find_by_category(String category_code){
		String sql ="select * from item where category_code like'%"+category_code+"%' order by code";
		return find_by(sql);
	}
//	名前検索・カテゴリ検索共通コード。
	 private static List<Item> find_by(String sql){

		// ただし、該当する商品が登録されていない場合はNULLを返す。
		 //名前が255文字以上の場合は先頭の255文字を参照する。
		 ArrayList<Item> list=null;
		Connection con =  DBManager.getConnection();
		try {
			//ステートメントオブジェクトの取得
			Statement smt = con.createStatement();
			//検索する
			ResultSet rs = smt.executeQuery(sql);
			//検索結果をArrayListに格納する
			list= new ArrayList<Item>();
			while(rs.next()){
				Item item= new Item(rs);
				list.add(item);
			}
			rs.close();
			smt.close();
		}
		catch(SQLException e){
				e.printStackTrace();
		}
		finally{ 
			try {
				if(con!=null){
				con.close();
				}
			} catch (SQLException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
		}
		return list;	
	}
	/**
	 *  
	 * @return 在庫数
	 */
//	 自身の商品コードで在庫情報テーブルを検索して該当する在庫情報を取得する。
	 public int getStock(){
//		 ただし、該当する商品が登録されていない場合は(-1)を返す。
		 int zaiko=-1;
		Connection con =  DBManager.getConnection();
		try {
			//ステートメントオブジェクトの取得
			Statement smt = con.createStatement();
			//検索する
			String sql ="select stocks from stock where item_code = '"+this.code+"'";
			ResultSet rs = smt.executeQuery(sql);
			if(rs.next()){
				zaiko = rs.getInt("stocks");
			}
			rs.close();
			smt.close();
		}
		catch(SQLException e){
				e.printStackTrace();
		}
		finally{ 
			try {
				if(con!=null){
				con.close();
				}
			} catch (SQLException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
		}
		return zaiko;	
	}
	/**
	 * 
	 * @return カテゴリ名
	 */
//	 自身の商品コードでカテゴリ名を検索して該当するカテゴリ名を取得する。
	 public String getCategoryName(){
//		 ただし、該当する商品が登録されていない場合はNULLを返す。
		 String  category_name=null;
		Connection con =  DBManager.getConnection();
		try {
			//ステートメントオブジェクトの取得
			Statement smt = con.createStatement();
			//検索する
			String sql ="select name from category where code = " + this.category_code;
			ResultSet rs = smt.executeQuery(sql);
			//検索結果をArrayListに格納する
			if(rs.next()){
				category_name = rs.getString("name");
			}
			rs.close();
			smt.close();
		}
		catch(SQLException e){
				e.printStackTrace();
		}
		finally{ 
			try {
				if(con!=null){
				con.close();
				}
			} catch (SQLException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
		}
		return category_name;	
	}
/**
 * 
 * @param orders 変更前の在庫数
 * @return 変更後の在庫数
 */
	// 変更する在庫数を受け取り、在庫情報テーブルの該当するレコードの在庫数を更新する。
	public int setStock(int orders){
	//	注文数が在庫数を上回った場合は(-1)を返し、エラーメッセージを表示する。
		int zaiko=-1;
		Connection con =  DBManager.getConnection();
		try {
			//ステートメントオブジェクトの取得
			Statement smt = con.createStatement();
			//検索する
			String sql ="select stocks from stock where item_code = " + this.code + " for update ";
			ResultSet rs = smt.executeQuery(sql);
			int s = -1;
			if(rs.next()){
				s = rs.getInt("stocks");
			}
			if(orders <= s){
				sql = "update stock set stocks = " + (s  - orders) + " where item_code = " + this.code;
				int count = smt.executeUpdate(sql);
				if(count==1){
					zaiko = s-orders;
				}
			}
			rs.close();
			smt.close();
		}
		catch(SQLException e){
				e.printStackTrace();
		}
		finally{ 
			try {
				if(con!=null){
				con.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return zaiko;	
	}
	/**
	 * 
	 * @param on_off
	 */
	//商品の販売可否を「false(販売不可)」「true(販売可)」で振り分ける。
	public void setOnoff(boolean on_off){
		//trueならば左の数・falseならば右の数を返す
		int sw = on_off ? 1 : 0;
		Connection con =  DBManager.getConnection();
		try {
			//ステートメントオブジェクトの取得
			Statement smt = con.createStatement();
			//検索する
			String sql = "update item set on_off = "
											+ sw + 
								"where code = " + this.code ;
			smt.executeUpdate(sql);
			smt.close();
		}
		catch(SQLException e){
				e.printStackTrace();
		}
		finally{ 
			try {
				if(con!=null){
				con.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	/**
	 * 商品名が10文字超える場合…で省略する
	 * @return 商品名
	 */
	public  String getShortName()
	{
		if(this.name.length() > 10) return this.name.substring(0, 10) + "…";
		return this.name;
	}
	/**
	 * 商品情報が10文字を超える場合…で省略する。
	 * @return 商品情報
	 */
	public String getShortInfo()
	{
		if(this.info.length() > 10) return this.info.substring(0, 10) + "…";
		return this.info;
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSize() {
		return size;
	}
	public void setSize(String size) {
		this.size = size;
	}
	public int getCost() {
		return cost;
	}
	public void setCost(int cost) {
		this.cost = cost;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public int getOn_off() {
		return on_off;
	}
	public void setOn_off(int on_off) {
		this.on_off = on_off;
	}
	public String getImage() {
		return image;
	}
	public void setImage(String image) {
		this.image = image;
	}
	public String getAlcohol() {
		return alcohol;
	}
	public void setAlcohol(String alcohol) {
		this.alcohol = alcohol;
	}
	public String getLocality() {
		return locality;
	}
	public void setLocality(String locality) {
		this.locality = locality;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	public String getCategory_code() {
		return category_code;
	}
	public void setCategory_code(String category_code) {
		this.category_code = category_code;
	}	
}
